코딩테스트 연습 - 3진법 뒤집기 | 프로그래머스 스쿨

[ 템플릿 코드 ]

#include <string>
#include <vector>
 
using namespace std;
 
int solution(int n) {
    int answer = 0;
    return answer;
}

[ 풀이 ]

int solution(int n)
{
    string s = "";
 
    while (n > 0)
    {
        s += (n % 3) + '0';
        n /= 3;
    }
 
    int answer = 0;
 
    for (char c : s)
    {
        answer = answer * 3 + (c - '0');
    }
 
    return answer;
}

[ 해설 ]

int solution(int n)
{
    // 3진수를 저장할 문자열
    // 나머지를 순서대로 넣기 때문에 뒤집힌 3진수가 저장된다.
    string s = "";
 
    // n이 0이 될 때까지 반복
    while (n > 0)
    {
        // n을 3으로 나눈 나머지를 구한다.
        // + '0'을 해서 숫자를 문자('0', '1', '2')로 변환한다.
        // 예) 2 + '0' -> '2'
        //
        // 45일 경우
        // 45 % 3 = 0 -> s = "0"
        // 15 % 3 = 0 -> s = "00"
        // 5  % 3 = 2 -> s = "002"
        // 1  % 3 = 1 -> s = "0021"
        //
        // 결과적으로 원래 3진수(1200)가 아닌
        // 뒤집힌 3진수(0021)가 저장된다.
        s += (n % 3) + '0';
 
        // 다음 자릿수를 계산하기 위해 3으로 나눈 몫을 저장
        //
        // 45 -> 15
        // 15 -> 5
        // 5  -> 1
        // 1  -> 0
        n /= 3;
    }
 
    // 최종 결과(10진수)를 저장할 변수
    int answer = 0;
 
    // 문자열에 저장된 뒤집힌 3진수를 한 글자씩 확인
    for (char c : s)
    {
        // 문자 숫자를 실제 숫자로 변환
        //
        // '0' - '0' = 0
        // '1' - '0' = 1
        // '2' - '0' = 2
        //
        // answer * 3 은 현재 값을 한 자리 왼쪽으로 이동시키는 것과 같다.
        //
        // 예) s = "0021"
        //
        // 첫 번째 문자 '0'
        // answer = 0 * 3 + 0 = 0
        //
        // 두 번째 문자 '0'
        // answer = 0 * 3 + 0 = 0
        //
        // 세 번째 문자 '2'
        // answer = 0 * 3 + 2 = 2
        //
        // 네 번째 문자 '1'
        // answer = 2 * 3 + 1 = 7
        //
        // 최종 결과 = 7
        answer = answer * 3 + (c - '0');
    }
 
    // 계산된 10진수 결과 반환
    return answer;
}

[ 타 답안 ]

#include <string>
#include <vector>
 
using namespace std;
 
int solution(int n) {
    // 최종 결과를 저장할 변수
    int answer = 0;
 
    // 3진수의 각 자릿수를 저장할 벡터
    vector<int> v;
 
    // n을 3진수로 변환
    while(n > 0){
        // 3으로 나눈 나머지를 벡터에 저장
        //
        // 예) n = 45
        // 45 % 3 = 0 -> [0]
        // 15 % 3 = 0 -> [0, 0]
        // 5  % 3 = 2 -> [0, 0, 2]
        // 1  % 3 = 1 -> [0, 0, 2, 1]
        //
        // 이미 뒤집힌 형태로 저장된다.
        v.push_back(n % 3);
 
        // 다음 자릿수 계산을 위해 3으로 나눈 몫 저장
        n /= 3;
    }
 
    // 현재 자릿값
    //
    // 3^0 = 1
    // 3^1 = 3
    // 3^2 = 9
    // ...
    int k = 1;
 
    // 벡터가 빌 때까지 반복
    while(!v.empty()) {
 
        // 벡터의 마지막 원소를 꺼내 사용
        //
        // [0,0,2,1]
        // 처음에는 1
        answer += k * v.back();
 
        // 사용한 마지막 원소 제거
        v.pop_back();
 
        // 다음 자릿수로 이동
        //
        // 1 -> 3 -> 9 -> 27 ...
        k *= 3;
    }
 
    return answer;
}

C++ CodingTest